早期的 Android 背景任務排程主要依靠 AlarmManager。開發者會設定一個時間點讓 App 醒來執行某段程式,例如同步資料、發送通知等。但這種方式會造成以下問題:
JobScheduler 的定位
JobScheduler 是 Android Framework 中的系統服務,名稱為 JobSchedulerService。它的職責是管理所有 App 註冊的「工作(Job)」任務,並根據系統狀態(如電源、網路、電池、閒置狀態等)決定何時觸發。
架構層級圖
[App 層]
↓
JobScheduler API
↓
[Framework 層]
JobSchedulerService
├─ JobStore (持久化工作)
├─ JobSchedulerService$JobHandler
├─ JobSchedulerService$JobSchedulerThread
↓
[System Server]
AMS / PMS / PowerManager / BatteryStatsService
val jobScheduler = context.getSystemService(JobScheduler::class.java)
val jobInfo = JobInfo.Builder(1, ComponentName(context, MyJobService::class.java))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build()
jobScheduler.schedule(jobInfo)
主要條件設定
條件類型 方法 說明
網路條件 setRequiredNetworkType() 僅在特定網路狀態下執行
電源條件 setRequiresCharging() 僅在充電時執行
閒置條件 setRequiresDeviceIdle() 僅在裝置閒置時執行
週期性任務 setPeriodic() 定期執行(但間隔最短 15 分鐘)
延遲執行 setMinimumLatency() 指定最早執行時間
最長延遲 setOverrideDeadline() 超過時間後必定執行
內部 key components
“提供跨版本、可靠且可重啟的任務排程解決方案。”
[App 層]
WorkManager API
↓
[AndroidX 層]
WorkManager Runtime
├─ WorkDatabase (SQLite)
├─ WorkerWrapper
├─ TaskExecutor
↓
[排程層]
├─ JobScheduler (API 23+)
├─ AlarmManager + BroadcastReceiver (API 14–22)
├─ Firebase JobDispatcher (舊備援)
名稱 說明
Worker 實際執行任務的類別(如上傳檔案)
WorkRequest 定義任務內容與條件
WorkManager 任務調度與監控管理入口
class UploadWorker(appContext: Context, workerParams: WorkerParameters)
: Worker(appContext, workerParams) {
override fun doWork(): Result {
uploadDataToServer()
return Result.success()
}
}
// 建立任務
val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build()
)
.build()
// 提交任務
WorkManager.getInstance(context).enqueue(uploadWorkRequest)
Android 版本 使用底層機制
API 23+ JobScheduler
API 14–22 AlarmManager + BroadcastReceiver
API 33+ JobScheduler + Battery Optimization Awareness
四、JobScheduler 與 WorkManager 的比較
項目 JobScheduler WorkManager
最低版本 API 21 API 14
條件支援 網路、電源、閒置等 網路、電源、儲存空間、自定條件
任務鏈接 ❌ 不支援 ✅ 支援工作鏈 (Chaining)
資料傳遞 Bundle Data (型別安全)
任務觀察 手動管理 LiveData / Coroutine Flow
任務持久化 可設定 自動持久化
適用場景 系統級背景任務 一般 App 背景同步
系統支援層 Framework Service Jetpack Library + System Service
JobScheduler 並非獨立運作,它與多個系統服務協作:
WorkManager 與 AndroidX 有深度整合:
例如:
workManager.getWorkInfoByIdLiveData(workRequest.id)
.observe(this) { workInfo ->
if (workInfo.state == WorkInfo.State.SUCCEEDED) {
Log.d("WorkManager", "Upload completed!")
}
}
+----------------------+
| JobScheduler API |
+----------------------+
|
v
+----------------------+
| JobSchedulerService |
| + JobStore |
| + JobHandler |
| + ConstraintsTracker|
+----------------------+
|
v
+----------------------+
| System Services (Power, Net, Battery) |
+--------------------------------------+
+---------------------------+
| WorkManager API (App) |
+---------------------------+
|
v
+---------------------------+
| WorkManager Runtime |
| - WorkDatabase |
| - Scheduler API |
| - WorkerWrapper |
+---------------------------+
|
v
+-----------------------------------+
| OS 支援層 |
| - JobScheduler (API 23+) |
| - AlarmManager (API < 23) |
| - Battery / Power / Network Mgmt |
+-----------------------------------+
JobScheduler 是 Android Framework 的核心排程服務,能在滿足條件下統一安排背景任務,節能又可靠。
WorkManager 是 Jetpack 封裝層,提供跨版本、一致、可觀察的任務管理機制。
在 Android 現代開發中,WorkManager 幾乎可視為 「JobScheduler 的官方封裝版」。